home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 37 / Amiga Format CD37 (1999-02-16)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-03].iso / -screenplay- / otherstuff / slamtiltjudge / slamtiltjudge.cxx < prev    next >
C/C++ Source or Header  |  1999-01-04  |  5KB  |  245 lines

  1. // A SAS-C example with Cxx (C++)
  2. // It uses the X-System, wich is a collection of classes for use with
  3. // the Amiga. If you are interrested the classes, feel free to mail me:
  4. // steffen.mars@stenloese.mail.telia.com
  5. // Note that this will not compile if you don't have the X-System
  6.  
  7. #include <CXX:Protos/FileSysX.cxx>
  8. #include <CXX:Protos/StringX.cxx>
  9. #include <CXX:Protos/DisplayX.cxx>
  10. #include <proto/exec.h>
  11. #include <proto/dos.h>
  12. #include <proto/asl.h>
  13.  
  14. char*    version="$VER:SlamtiltJudge v1.3 (© The Hanged Man)";
  15. char*    title=(version+5);
  16.  
  17. class    HighScore
  18. {
  19.     private:
  20.     unsigned char    Score[6];
  21.     unsigned char    Initials[3];
  22.     
  23.     public:
  24.     HighScore();
  25.     HighScore(HighScore& hs2);
  26.     ~HighScore(){}
  27.     void    Clear();
  28.     void    Peek(void* addr);
  29.     void    Poke(void* addr);
  30.     void    Swap(HighScore& hs2);
  31.     int        operator== (HighScore& hs2);
  32.     int        operator<  (HighScore& hs2);
  33. };
  34. HighScore::HighScore()
  35. {
  36.     Clear();
  37. }
  38. HighScore::HighScore(HighScore& hs2)
  39. {
  40.     int i;
  41.     for (i=0; i<6; i++) Score[i]=hs2.Score[i];
  42.     for (i=0; i<3; i++) Initials[i]=hs2.Initials[i];
  43. }
  44. void HighScore::Clear()
  45. {
  46.     int i;
  47.     for (i=0; i<6; i++) Score[i]=0;
  48.     for (i=0; i<3; i++) Initials[i]=0;
  49. }
  50. void HighScore::Peek(void* addr)
  51. {
  52.     unsigned char*    cptr;
  53.     int    i;
  54.     
  55.     cptr = (unsigned char*)addr;
  56.     for (i=0; i<6; i++, cptr++) Score[i]=*cptr;
  57.     for (i=0; i<3; i++, cptr++) Initials[i]=*cptr;
  58. }
  59. void HighScore::Poke(void* addr)
  60. {
  61.     unsigned char*    cptr;
  62.     int    i;
  63.     
  64.     cptr = (unsigned char*)addr;
  65.     for (i=0; i<6; i++, cptr++) *cptr=Score[i];
  66.     for (i=0; i<3; i++, cptr++) *cptr=Initials[i];
  67. }
  68. void HighScore::Swap(HighScore& hs2)
  69. {
  70.     unsigned char    chr;
  71.     int i;
  72.     
  73.     for (i=0; i<6; i++)
  74.     {
  75.         chr=Score[i];
  76.         Score[i] = hs2.Score[i];
  77.         hs2.Score[i] = chr;
  78.     }
  79.     for (i=0; i<3; i++)
  80.     {
  81.         chr=Initials[i];
  82.         Initials[i] = hs2.Initials[i];
  83.         hs2.Initials[i] = chr;
  84.     }
  85. }
  86. int    HighScore::operator== (HighScore& hs2)
  87. {
  88.     int i;
  89.     for (i=0; i<6; i++) if (Score[i] != hs2.Score[i]) return 0;
  90.     for (i=0; i<3; i++) if (Initials[i] != hs2.Initials[i]) return 0;
  91.     return 1;
  92. }
  93. int    HighScore::operator< (HighScore& hs2)
  94. {
  95.     int i;
  96.     
  97.     for (i=0; i<6; i++)
  98.     {
  99.         if (Score[i] < hs2.Score[i]) return 1;
  100.         if (Score[i] > hs2.Score[i]) return 0;
  101.     }
  102.     return 0;
  103. }
  104.  
  105. int    Judge(char* name1, char* name2, int offset)
  106. {
  107.     FileX         fil1,fil2;    // FileX is used for file manipulation
  108.     HighScore    score[10];    // Array of 10 highscore objects
  109.     void*        mem_array;    // For use with AllocMem()
  110.     int            i,j;        // General purpose counters
  111.     
  112.     // Check if the needed files exists via DosX class
  113.     if (!DosX::Exists(name1)) return 1;
  114.     if (!DosX::Exists(name2)) return 1;
  115.  
  116.     // Use exec to allocate 16 bytes(nice round number) memory area
  117.     mem_array = ::AllocMem(16,0);
  118.  
  119.     // Load the two files into two FileX objects
  120.     fil1.Load(name1);
  121.     fil2.Load(name2);
  122.  
  123.     // Copy a part of the file used for highscore information to mem
  124.     // Then give the HighScore objects the information
  125.     for (i=0; i<5; i++)
  126.     {
  127.         fil1.Read(mem_array,offset+i*14,14);
  128.         score[i].Peek(mem_array);
  129.         fil2.Read(mem_array,offset+i*14,14);
  130.         score[i+5].Peek(mem_array);
  131.     }
  132.  
  133.     // Remove duplicates
  134.     for (i=0; i<9; i++) for (j=i+1; j<10; j++)
  135.     {
  136.         if (score[i]==score[j]) {score[i].Clear(); break;}
  137.     }
  138.  
  139.     // Do the good ol' bubble sort
  140.     for (i=0; i<10; i++) for (j=0; j<10; j++)
  141.         if (score[j]<score[i]) score[j].Swap(score[i]);
  142.  
  143.     // 'Poke' the 5 best highscores to a mem-block
  144.     // and write the memblock to FileX
  145.     for (i=0; i<5; i++)
  146.     {
  147.         score[i].Poke(mem_array);
  148.         fil2.Write(mem_array,offset+i*14,14);
  149.     }
  150.  
  151.     // Save the file
  152.     fil2.Save(name2);
  153.     ::FreeMem(mem_array,16);
  154.     return 0;
  155. }
  156.  
  157. int main(int argc, char** argv)
  158. {
  159.     StringX        path1,path2,file1,file2;
  160.     char        path[256];
  161.     WinX        window(title,0,0,32,32);
  162.     window.SizeText(29,8);
  163.     UWORD        moenster[]={0x5555,0xAAAA};
  164.     BPTR        lock;
  165.  
  166.     ::SetProgramName("SlamtiltJudge");
  167.  
  168.     window.Pattern(moenster,1);
  169.     window.GraphicsPenA(2);
  170.     window.GraphicsPenB(-1);
  171.     
  172.     lock = ::Lock("",ACCESS_READ);
  173.     ::NameFromLock(lock,path,255);
  174.     path2 = path;
  175.     path2 += "/";
  176.     ::UnLock(lock);
  177.  
  178.     window.WaitIDCMP(IDCMP_NEWSIZE|IDCMP_CHANGEWINDOW);
  179.     if (argc < 2)
  180.     {
  181.         window.Rectangle(0,0,16384,16384);
  182.         window.Print("Where",1);
  183.         window.Print("is",2);
  184.         window.Print("highscores",3);
  185.         window.Print("?",4);
  186.         TagItem    tags[]=
  187.         {
  188.             ASLFR_TitleText,(ULONG)"Where's new highscores ?",
  189.             ASLFR_InitialDrawer,(ULONG)"RAM:",
  190.             TAG_END,0
  191.         };
  192.         do
  193.         {
  194.             if (window.ReqDrawer(path,255,tags))
  195.             {
  196.                 window.Rectangle(0,0,320,80);
  197.                 window.Print("ABORTED",3);
  198.                 window.WaitClose();
  199.                 return 5;
  200.             }
  201.             path1 = path;
  202.             path1 += "/";
  203.         }while (path1 == path2);
  204.     }
  205.     else path1 = argv[1];
  206.     if (argc >2) path2 = argv[2];
  207.  
  208.     window.Rectangle(0,0,320,80);
  209.     
  210.     file1 = path1+"Demon.dat";
  211.     file2 = path2+"Demon.dat";
  212.     window.Print("Night of The Demon",1,1);
  213.     if (Judge(file1.Pointer(),file2.Pointer(),0x76))
  214.         window.Print("FAIL",22,1);
  215.     else
  216.         window.Print("OK",22,1);
  217.  
  218.     file1 = path1+"Pirate.dat";
  219.     file2 = path2+"Pirate.dat";
  220.     window.Print("The Pirate",1,2);
  221.     if (Judge(file1.Pointer(),file2.Pointer(),0x94))
  222.         window.Print("FAIL",22,2);
  223.     else
  224.         window.Print("OK",22,2);
  225.  
  226.     file1 = path1+"Mean.dat";
  227.     file2 = path2+"Mean.dat";
  228.     window.Print("Mean Machines",1,3);
  229.     if (Judge(file1.Pointer(),file2.Pointer(),0x90))
  230.         window.Print("FAIL",22,3);
  231.     else
  232.         window.Print("OK",22,3);
  233.  
  234.     file1 = path1+"Space.dat";
  235.     file2 = path2+"Space.dat";
  236.     window.Print("Ace of Space",1,4);
  237.     if (Judge(file1.Pointer(),file2.Pointer(),0x90))
  238.         window.Print("FAIL",22,4);
  239.     else
  240.         window.Print("OK",22,4);
  241.  
  242.     window.WaitClose();
  243.     return 0;
  244. }
  245.